package com.zombies.list.adt;



/**
 * 数据结构线性表 抽象数据类型（ADT）
 *
 * @author zombies
 * @create 2022-04-08 23:09
 */
public interface MyList<E> {

//    /**
//     * 建立一个空的线性表
//     *
//     * @return 返回一个空的线性表
//     */
//    MyList<E> list();


    /**
     * 查看线性表是否为空
     *
     * @return 为空返回true 反之false
     */
    boolean isEmpty();

    /**
     * 查看线性表是否已满
     *
     * @return 满了返回true 反之false
     */
    boolean isFull();



    /**
     * 返回线性表的第一个元素
     *
     * @return 返回第一个元素
     */
    E getFirst();

    /**
     * 返回线性表的最后一个元素
     *
     * @return 返回最后一个的元素
     */
    E getLast();

    /**
     * 删除线性表的第一个元素，并将该值返回
     *
     * @return 返回删除的第一个元素
     */
    E removeFirst();

    /**
     * 删除线性表的最后一个元素，并将该值返回
     *
     * @return 返回删除的最后一个元素
     */
    E removeLast();

    /**
     * 将元素插入到线性表的开头位置
     *
     * @param e 将要插入开头的元素
     */
    void addFirst(E e);

    /**
     * 将元素插入到线性表的末尾位置
     *
     * @param e 将要插入末尾的元素
     */
    void addLast(E e);

    /**
     * 检查元素是否在线性表中
     *
     * @param e 将要检索的目标元素
     * @return 存在返回true，反之返回false
     */
    boolean contains(E e);

    /**
     * 返回线性表元素的个数
     *
     * @return 返回线性表元素的个数
     */
    int size();

    /**
     * 将元素插入到线性表的末尾
     *
     * @param e 将要插入的目标元素
     * @return 成功则返回true，失败则返回false
     */
    boolean add(E e);

    /**
     * 将第一次出现的元素删除
     *
     * @param e 将要删除的目标元素
     * @return 成功则返回true，失败则返回false
     */
    boolean remove(E e);

    /**
     * 将list中的元素全部添加到线性表末尾
     *
     * @param list 将要添加的目标元素集合
     * @return 成功则返回true，失败则返回false
     */
    boolean addAll(MyList<E> list);

    /**
     * 将list中的元素全部添加到线性表的指定索引位置，位置之后的元素后移
     *
     * @param index 线性表的index位置
     * @param list 将要添加的目标元素集合
     * @return 成功则返回true，失败则返回false
     */
    boolean addAll(int index, MyList<E> list);

    /**
     * 删除线性表中的所有元素
     *
     */
    void clear();

    /**
     * 返回线性表的index位置的元素
     *
     * @param index 线性表的index位置
     * @return 返回index位置所在元素
     */
    E get(int index);

    /**
     * 以元素e替代线性表index位置的元素，并返回被取代的元素
     *
     * @param index 线性表的index位置
     * @param e 将要插入到index位置的元素
     * @return 返回index位置所在元素
     */
    E set(int index,E e);


    /**
     * 将元素e插入到线性表index位置，其他元素后移
     *
     * @param index 线性表的index位置
     * @param e 将要插入到index位置的元素
     */
    void add(int index,E e);

    /**
     * 删除线性表中index位置的元素，并返回
     *
     * @param index 线性表的index位置
     * @return 返回指定位置被删除的元素
     */
    E remove(int index);

    /**
     * 返回元素e在线性表中第一次出现的位置，若不存在就返回-1
     *
     * @param e 查询的目标元素
     * @return 若存在返回index，反之返回-1
     */
    int indexOf(E e);


    /**
     * 返回元素e在线性表中最后一次出现的位置，若不存在就返回-1
     *
     * @param e 查询的目标元素
     * @return 若存在返回index，反之返回-1
     */
    int lastIndexOf(E e);


    /**
     * 返回被反转的线性表
     *
     * @return 返回一个被反转的线性表
     */
    MyList<E> getReverseList();


    /**
     * 就是一个展示线性表所有的数据
     *
     */
    void show();







}
